package com.changan.dto;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import lombok.Data;

import java.util.Date;

/**
 * 用户Excel导出DTO（与Excel列一一映射）
 */
@Data
public class UserExcelDTO {

    // 1. 用户ID：Excel列名"用户ID"，索引0（列顺序从0开始）
    @ExcelProperty(value = "用户ID", index = 0)
    private Long id;

    // 2. 用户名：Excel列名"用户名"
    @ExcelProperty(value = "用户名", index = 1)
    private String username;

    // 3. 昵称：Excel列名"昵称"
    @ExcelProperty(value = "昵称", index = 2)
    private String nickname;

    // 4. 邮箱：Excel列名"邮箱"
    @ExcelProperty(value = "邮箱", index = 3)
    private String email;

    // 5. 联系电话：Excel列名"联系电话"
    @ExcelProperty(value = "联系电话", index = 4)
    private String phoneNumber;

    // 6. 性别：Excel列名"性别"，用自定义Converter将0/1/2转为"男/女/保密"
    @ExcelProperty(value = "性别", index = 5, converter = SexConverter.class)
    private Integer sex;

    // 7. 用户状态：Excel列名"状态"，用自定义Converter将0/1转为"禁用/启用"
    @ExcelProperty(value = "状态", index = 6, converter = StatusConverter.class)
    private Integer status;

    // 8. 生日：Excel列名"生日"，指定日期格式为"yyyy-MM-dd"
    @ExcelProperty(value = "生日", index = 7)
    @DateTimeFormat("yyyy-MM-dd") // 导出时日期格式
    private Date birth;

    // 9. 创建时间：Excel列名"创建时间"，指定日期时间格式
    @ExcelProperty(value = "创建时间", index = 8)
    @DateTimeFormat("yyyy-MM-dd HH:mm:ss") // 导出时日期时间格式
    private Date createTime;

    // -------------------------- 自定义Converter（Excel值转换） --------------------------

    /**
     * 性别转换器：Integer(0/1/2) → 字符串("男/女/保密")
     */
    public static class SexConverter implements Converter<Integer> {
        @Override
        public Class<?> supportJavaTypeKey() {
            return Integer.class; // 支持的Java类型
        }

        @Override
        public CellDataTypeEnum supportExcelTypeKey() {
            return CellDataTypeEnum.STRING; // 导出到Excel的类型（字符串）
        }

        // 读取Excel时转换（导出场景可忽略）
        @Override
        public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
            String value = cellData.getStringValue();
            return "男".equals(value) ? 0 : ("女".equals(value) ? 1 : 2);
        }

        // 写入Excel时转换（核心：将0/1/2转为文字）
        @Override
        public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
            String sexText = switch (value) {
                case 0 -> "男";
                case 1 -> "女";
                case 2 -> "保密";
                default -> "未知";
            };
            return new WriteCellData<>(sexText);
        }
    }

    /**
     * 状态转换器：Integer(0/1) → 字符串("禁用/启用")
     */
    public static class StatusConverter implements Converter<Integer> {
        @Override
        public Class<?> supportJavaTypeKey() {
            return Integer.class;
        }

        @Override
        public CellDataTypeEnum supportExcelTypeKey() {
            return CellDataTypeEnum.STRING;
        }

        // 读取Excel时转换（导出场景可忽略）
        @Override
        public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
            return "启用".equals(cellData.getStringValue()) ? 1 : 0;
        }

        // 写入Excel时转换（核心：将0/1转为文字）
        @Override
        public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
            String statusText = value == 1 ? "启用" : "禁用";
            return new WriteCellData<>(statusText);
        }
    }
}